@@ -0,0 +1,40 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +# Generated by Django 1.11.22 on 2019-08-12 06:29  | 
            |
| 3 | 
                +from __future__ import unicode_literals  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django.db import migrations, models  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +  | 
            |
| 8 | 
                +class Migration(migrations.Migration):  | 
            |
| 9 | 
                +  | 
            |
| 10 | 
                + dependencies = [  | 
            |
| 11 | 
                +        ('account', '0037_auto_20190418_1736'),
               | 
            |
| 12 | 
                + ]  | 
            |
| 13 | 
                +  | 
            |
| 14 | 
                + operations = [  | 
            |
| 15 | 
                + migrations.AddField(  | 
            |
| 16 | 
                + model_name='userinfo',  | 
            |
| 17 | 
                + name='clerk_id',  | 
            |
| 18 | 
                + field=models.CharField(blank=True, db_index=True, help_text='\u5e97\u5458\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='clerk_id'),  | 
            |
| 19 | 
                + ),  | 
            |
| 20 | 
                + migrations.AlterField(  | 
            |
| 21 | 
                + model_name='lensmaninfo',  | 
            |
| 22 | 
                + name='sex',  | 
            |
| 23 | 
                + field=models.IntegerField(choices=[(0, '\u672a\u77e5'), (1, '\u7537'), (2, '\u5973')], default=0, help_text='\u6444\u5f71\u5e08\u6027\u522b', verbose_name='sex'),  | 
            |
| 24 | 
                + ),  | 
            |
| 25 | 
                + migrations.AlterField(  | 
            |
| 26 | 
                + model_name='tourguideinfo',  | 
            |
| 27 | 
                + name='sex',  | 
            |
| 28 | 
                + field=models.IntegerField(choices=[(0, '\u672a\u77e5'), (1, '\u7537'), (2, '\u5973')], default=0, help_text='\u5bfc\u6e38\u6027\u522b', verbose_name='sex'),  | 
            |
| 29 | 
                + ),  | 
            |
| 30 | 
                + migrations.AlterField(  | 
            |
| 31 | 
                + model_name='userinfo',  | 
            |
| 32 | 
                + name='sex',  | 
            |
| 33 | 
                + field=models.IntegerField(choices=[(0, '\u672a\u77e5'), (1, '\u7537'), (2, '\u5973')], default=0, help_text='\u7528\u6237\u6027\u522b', verbose_name='sex'),  | 
            |
| 34 | 
                + ),  | 
            |
| 35 | 
                + migrations.AlterField(  | 
            |
| 36 | 
                + model_name='wechatinfo',  | 
            |
| 37 | 
                + name='sex',  | 
            |
| 38 | 
                + field=models.IntegerField(choices=[(0, '\u672a\u77e5'), (1, '\u7537'), (2, '\u5973')], default=0, help_text='\u7528\u6237\u6027\u522b', verbose_name='sex'),  | 
            |
| 39 | 
                + ),  | 
            |
| 40 | 
                + ]  | 
            
                @@ -340,6 +340,8 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):  | 
            ||
| 340 | 340 | 
                membercardid = models.CharField(_(u'membercardid'), max_length=32, blank=True, null=True, help_text=_(u'会员卡编号'), db_index=True)  | 
            
| 341 | 341 | 
                memberusercardcode = models.CharField(_(u'memberusercardcode'), max_length=32, blank=True, null=True, help_text=_(u'用户会员卡编号'), db_index=True)  | 
            
| 342 | 342 | 
                 | 
            
| 343 | 
                + clerk_id = models.CharField(_(u'clerk_id'), max_length=32, blank=True, null=True, help_text=u'店员唯一标识', db_index=True)  | 
            |
| 344 | 
                +  | 
            |
| 343 | 345 | 
                test_user = models.BooleanField(_(u'test_user'), default=False, help_text=_(u'是否为测试用户'), db_index=True)  | 
            
| 344 | 346 | 
                 | 
            
| 345 | 347 | 
                class Meta:  | 
            
                @@ -390,9 +392,9 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):  | 
            ||
| 390 | 392 | 
                ]  | 
            
| 391 | 393 | 
                 | 
            
| 392 | 394 | 
                def brandata(self, brand_id=None):  | 
            
| 393 | 
                - if self.unionid:  | 
            |
| 395 | 
                + if self.clerk_id:  | 
            |
| 394 | 396 | 
                try:  | 
            
| 395 | 
                - saleclerk = SaleclerkInfo.objects.get(brand_id=brand_id, unionid=self.unionid, status=True)  | 
            |
| 397 | 
                + saleclerk = SaleclerkInfo.objects.get(clerk_id=self.clerk_id, status=True)  | 
            |
| 396 | 398 | 
                except SaleclerkInfo.DoesNotExist:  | 
            
| 397 | 399 | 
                saleclerk = None  | 
            
| 398 | 400 | 
                             saleclerk_info = saleclerk.data if saleclerk and saleclerk.is_auth else {}
               | 
            
                @@ -227,6 +227,7 @@ urlpatterns += [  | 
            ||
| 227 | 227 | 
                 | 
            
| 228 | 228 | 
                urlpatterns += [  | 
            
| 229 | 229 | 
                url(r'^clerk/submit$', oauth_views.clerk_submit_api, name='clerk_submit_api'), # 店员信息提交  | 
            
| 230 | 
                + url(r'^clerk/submit2$', oauth_views.clerk_submit2_api, name='clerk_submit2_api'), # 店员信息提交  | 
            |
| 230 | 231 | 
                url(r'^clerk/sale/decrypt$', sale_views.clerk_sale_decrypt_api, name='clerk_sale_decrypt_api'),  | 
            
| 231 | 232 | 
                url(r'^clerk/sale/submit$', sale_views.clerk_sale_submit_api, name='clerk_sale_submit_api'), # 店员销售信息提交  | 
            
| 232 | 233 | 
                url(r'^clerk/integral/list$', sale_views.clerk_integral_list_api, name='clerk_integral_list_api'), #  | 
            
                @@ -0,0 +1,20 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +# Generated by Django 1.11.22 on 2019-08-12 06:29  | 
            |
| 3 | 
                +from __future__ import unicode_literals  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django.db import migrations, models  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +  | 
            |
| 8 | 
                +class Migration(migrations.Migration):  | 
            |
| 9 | 
                +  | 
            |
| 10 | 
                + dependencies = [  | 
            |
| 11 | 
                +        ('guideline', '0002_auto_20181117_0052'),
               | 
            |
| 12 | 
                + ]  | 
            |
| 13 | 
                +  | 
            |
| 14 | 
                + operations = [  | 
            |
| 15 | 
                + migrations.AlterField(  | 
            |
| 16 | 
                + model_name='screenadmininfo',  | 
            |
| 17 | 
                + name='sex',  | 
            |
| 18 | 
                + field=models.IntegerField(choices=[(0, '\u672a\u77e5'), (1, '\u7537'), (2, '\u5973')], default=0, help_text='\u7528\u6237\u6027\u522b', verbose_name='sex'),  | 
            |
| 19 | 
                + ),  | 
            |
| 20 | 
                + ]  | 
            
                @@ -0,0 +1,34 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +# Generated by Django 1.11.22 on 2019-08-12 06:29  | 
            |
| 3 | 
                +from __future__ import unicode_literals  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django.db import migrations, models  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +  | 
            |
| 8 | 
                +class Migration(migrations.Migration):  | 
            |
| 9 | 
                +  | 
            |
| 10 | 
                + dependencies = [  | 
            |
| 11 | 
                +        ('mch', '0040_auto_20190810_1619'),
               | 
            |
| 12 | 
                + ]  | 
            |
| 13 | 
                +  | 
            |
| 14 | 
                + operations = [  | 
            |
| 15 | 
                + migrations.AddField(  | 
            |
| 16 | 
                + model_name='saleclerkinfo',  | 
            |
| 17 | 
                + name='user_id',  | 
            |
| 18 | 
                + field=models.CharField(blank=True, db_index=True, help_text='\u7528\u6237\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='user_id'),  | 
            |
| 19 | 
                + ),  | 
            |
| 20 | 
                + migrations.AlterField(  | 
            |
| 21 | 
                + model_name='saleclerkinfo',  | 
            |
| 22 | 
                + name='clerk_sex',  | 
            |
| 23 | 
                + field=models.IntegerField(choices=[(0, '\u672a\u77e5'), (1, '\u7537'), (2, '\u5973')], db_index=True, default=1, help_text='\u5e97\u5458\u6027\u522b', verbose_name='clerk_sex'),  | 
            |
| 24 | 
                + ),  | 
            |
| 25 | 
                + migrations.AlterField(  | 
            |
| 26 | 
                + model_name='saleclerkinfo',  | 
            |
| 27 | 
                + name='sex',  | 
            |
| 28 | 
                + field=models.IntegerField(choices=[(0, '\u672a\u77e5'), (1, '\u7537'), (2, '\u5973')], db_index=True, default=0, help_text='Sex', verbose_name='sex'),  | 
            |
| 29 | 
                + ),  | 
            |
| 30 | 
                + migrations.AlterUniqueTogether(  | 
            |
| 31 | 
                + name='saleclerkinfo',  | 
            |
| 32 | 
                +            unique_together=set([('brand_id', 'unionid'), ('brand_id', 'user_id')]),
               | 
            |
| 33 | 
                + ),  | 
            |
| 34 | 
                + ]  | 
            
                @@ -377,6 +377,7 @@ class SaleclerkInfo(BaseModelMixin, SexModelMixin):  | 
            ||
| 377 | 377 | 
                clerk_sex = models.IntegerField(_(u'clerk_sex'), choices=SexModelMixin.SEX_TUPLE, default=SexModelMixin.MALE, help_text=u'店员性别', db_index=True)  | 
            
| 378 | 378 | 
                clerk_phone = models.CharField(_(u'clerk_phone'), max_length=11, blank=True, null=True, help_text=u'店员联系电话')  | 
            
| 379 | 379 | 
                 | 
            
| 380 | 
                + user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)  | 
            |
| 380 | 381 | 
                unionid = models.CharField(_(u'unionid'), max_length=32, blank=True, null=True, help_text=u'微信 UnionID', db_index=True)  | 
            
| 381 | 382 | 
                openid = models.CharField(_(u'openid'), max_length=32, blank=True, null=True, help_text=u'微信 OpenID', db_index=True)  | 
            
| 382 | 383 | 
                 | 
            
                @@ -396,7 +397,8 @@ class SaleclerkInfo(BaseModelMixin, SexModelMixin):  | 
            ||
| 396 | 397 | 
                verbose_name = _(u'经销商销售员信息')  | 
            
| 397 | 398 | 
                verbose_name_plural = _(u'经销商销售员信息')  | 
            
| 398 | 399 | 
                unique_together = (  | 
            
| 399 | 
                -            ('unionid', 'brand_id'),
               | 
            |
| 400 | 
                +            ('brand_id', 'unionid'),
               | 
            |
| 401 | 
                +            ('brand_id', 'user_id'),
               | 
            |
| 400 | 402 | 
                )  | 
            
| 401 | 403 | 
                 | 
            
| 402 | 404 | 
                def __unicode__(self):  | 
            
                @@ -7,7 +7,7 @@ from django_logit import logit  | 
            ||
| 7 | 7 | 
                from django_response import response  | 
            
| 8 | 8 | 
                from json_render import json_render  | 
            
| 9 | 9 | 
                 | 
            
| 10 | 
                -from account.models import LensmanInfo, TourGuideInfo  | 
            |
| 10 | 
                +from account.models import LensmanInfo, TourGuideInfo, UserInfo  | 
            |
| 11 | 11 | 
                from mch.models import BrandInfo, DistributorInfo, SaleclerkInfo  | 
            
| 12 | 12 | 
                from utils.error.errno_utils import ProductBrandStatusCode, ProductDistributorStatusCode, SaleclerkStatusCode  | 
            
| 13 | 13 | 
                from utils.redis.connect import r  | 
            
                @@ -121,3 +121,49 @@ def clerk_submit_api(request):  | 
            ||
| 121 | 121 | 
                clerk.save()  | 
            
| 122 | 122 | 
                 | 
            
| 123 | 123 | 
                     return response(200, 'Submit Success', u'提交成功', {})
               | 
            
| 124 | 
                +  | 
            |
| 125 | 
                +  | 
            |
| 126 | 
                +@logit  | 
            |
| 127 | 
                +@transaction.atomic  | 
            |
| 128 | 
                +def clerk_submit2_api(request):  | 
            |
| 129 | 
                + """ 店员授权信息提交 """  | 
            |
| 130 | 
                +    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            |
| 131 | 
                +    distributor_id = request.POST.get('distributor_id', '')
               | 
            |
| 132 | 
                +    user_id = request.POST.get('user_id', '')
               | 
            |
| 133 | 
                +    unionid = request.POST.get('unionid', '')
               | 
            |
| 134 | 
                +    openid = request.POST.get('openid', '')
               | 
            |
| 135 | 
                +    phone = request.POST.get('phone', '')
               | 
            |
| 136 | 
                +  | 
            |
| 137 | 
                + if SaleclerkInfo.objects.filter(brand_id=brand_id, clerk_phone=phone).exclude(user_id=user_id).exists():  | 
            |
| 138 | 
                + return response(SaleclerkStatusCode.CLERK_PHONE_ALREADY_EXISTS)  | 
            |
| 139 | 
                +  | 
            |
| 140 | 
                + try:  | 
            |
| 141 | 
                + distributor = DistributorInfo.objects.get(distributor_id=distributor_id)  | 
            |
| 142 | 
                + except DistributorInfo.DoesNotExist:  | 
            |
| 143 | 
                + return response(ProductDistributorStatusCode.DISTRIBUTOR_NOT_FOUND)  | 
            |
| 144 | 
                +  | 
            |
| 145 | 
                +    fields = {
               | 
            |
| 146 | 
                + 'distributor_id': distributor_id,  | 
            |
| 147 | 
                + 'distributor_name': distributor.distributor_name,  | 
            |
| 148 | 
                +        'clerk_name': request.POST.get('name', ''),
               | 
            |
| 149 | 
                +        'clerk_sex': int(request.POST.get('sex', 1)),
               | 
            |
| 150 | 
                + 'clerk_phone': phone,  | 
            |
| 151 | 
                + 'unionid': unionid,  | 
            |
| 152 | 
                + 'openid': openid,  | 
            |
| 153 | 
                + 'user_status': SaleclerkInfo.UNVERIFIED,  | 
            |
| 154 | 
                + }  | 
            |
| 155 | 
                +  | 
            |
| 156 | 
                + clerk, created = SaleclerkInfo.objects.select_for_update().get_or_create(brand_id=brand_id, user_id=user_id, defaults=fields)  | 
            |
| 157 | 
                + # clerk.user_status = SaleclerkInfo.UNVERIFIED  | 
            |
| 158 | 
                + clerk.status = True  | 
            |
| 159 | 
                + # 状态为 UNVERIFIED 的允许修改, 其他需要登录摄影师 APP 进行信息的修改  | 
            |
| 160 | 
                + if clerk.user_status not in [SaleclerkInfo.UNVERIFIED, SaleclerkInfo.REFUSED]:  | 
            |
| 161 | 
                + return response(SaleclerkStatusCode.CLERK_ALREADY_NOT_UNVERIFIED)  | 
            |
| 162 | 
                + if not created:  | 
            |
| 163 | 
                + for key, value in fields.iteritems():  | 
            |
| 164 | 
                + setattr(clerk, key, value)  | 
            |
| 165 | 
                + clerk.save()  | 
            |
| 166 | 
                +  | 
            |
| 167 | 
                + UserInfo.objects.filter(user_id=user_id).update(clerk_id=clerk.clerk_id)  | 
            |
| 168 | 
                +  | 
            |
| 169 | 
                +    return response(200, 'Submit Success', u'提交成功', {})
               |